import json
import ast

from langchain.agents import tool
from yolov8detect import detect_defects,summarize_defects
from generate_report import generate_pdf_report

#构建检测工具
@tool
def detect_defect_tool(path: str) ->list[dict]:  #->函数返回型提示
    """用path路径调用detect_defect函数 返回缺陷列表 """   #使用说明
    return detect_defects(path)

#构建总结函数工具
@tool                                               #解决办法：将参数定义成单个 str，langchain输入格式为"[{'label': 'orange'}]" 不是标准json格式 用ast来解决
def summarize_defects_tool(defects_json: str):    #注:angChain 默认只支持一些简单参数类型（如 str, int, float）。当输入是复杂结构（如 list[dict]）时，它会自动把它序列化为字符串传入工具函数
    """"
    输入JSON 字符串形式的缺陷列表，每个缺陷是包含label和conf的字典
    输出总结后交给LLM进行深入分析。
    """
    defects = ast.literal_eval(defects_json) #load string
    summary=summarize_defects(defects)
    prompt = f"""你是一位工业检测专家。以下是模型总结："{summary}"请进行进一步详细分析用于生产控制，比如：
- 检测结果是否合理
- 是否具有实际工业价值
- 对后续模型改进或采集数据的建议。"""
    return prompt


# @tool
# def generate_report_tool(filename:str, image_path:str, defects_json):  #zero-shot-react-description Agent（即 ZeroShotAgent）只支持单参数输入的工具（tool）
#     """给你pdf保存地址 检测图片保存地址以及输入JSON 字符串形式的缺陷列表，每个缺陷是包含label和conf的字典，你要自动生成pdf报告保存于pdf保存地址"""
#     defects = ast.literal_eval(defects_json)
#     return generate_pdf_report(filename,image_path,defects)

